﻿// CTabAudioKc3x.cpp: 实现文件
//

#include "pch.h"
#include "DntDemo.h"
#include "afxdialogex.h"
#include "CTabAudioKc3x.h"

#include "CPopMic.h"
#include "CPopTestTone.h"
#include "CPopSpeaker.h"
#include "CPopDelay.h"
#include "CPopEq.h"
#include "CPopAccount.h"
#define TAG	"AudioKc3x"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 标准C语言函数 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
KC3X_REGI_DIFF* mKc3x;
bool isTabKc3xRegi;
bool isPopKc3xRegi;

static const uint8_t Tab_InputSwitch[] = {						// KCM_INPUT_SOURCE     KC3X_INPUT_TYPE
	0xff,
	KCM_INPUT_ANALOG,			                            // 音源选择模拟输入
	KCM_INPUT_RX1,				                            // 音源选择RX1输入
	KCM_INPUT_RX2,				                            // 音源选择RX2输入
	KCM_INPUT_RX3,				                            // 音源选择RX3输入
	KCM_INPUT_SD,				                            // 音源选择SD/TF卡输入
	KCM_INPUT_UDISK,				                        // 音源选择U盘输入
	KCM_INPUT_PC,				                            // 音源选择USB声卡输入
	KCM_INPUT_E8CH,				                            // 音源选择外置7.1声道输入
	KCM_INPUT_BT,				                            // 音源选择蓝牙输入
	KCM_INPUT_HDMI1,				                        // 音源选择HDMI1输入
	KCM_INPUT_HDMI2,				                        // 音源选择HDMI2输入
	KCM_INPUT_HDMI3,				                        // 音源选择HDMI3输入
	KCM_INPUT_ARC,				                            // 音源选择HDMI ARC输入
};

static const uint8_t Tab_ListenMode[] = {
	0xff,
	KCM_LISTEN_STEREO, 										// 双声道立体声，对应 LISTEN_MODE_HIFI
	KCM_LISTEN_STEREO | KCM_LISTEN_ENA_SW, 					// 双声道立体声+超低音，对应 LISTEN_MODE_2_1CH
	KCM_LISTEN_MULTI | KCM_LISTEN_ENA_SW, 					// 选择多声道源码模式，没有任何多声道算法，对应 LISTEN_MODE_SURROUND1
	KCM_LISTEN_SURROUND | KCM_LISTEN_ENA_SW | 0, 			// 选择多声道模式，算法0，对应 LISTEN_MODE_SURROUND2 
	KCM_LISTEN_SURROUND | 1, 								// 选择多声道模式，算法1，对应 LISTEN_MODE_SURROUND3
	KCM_LISTEN_SURROUND | KCM_LISTEN_ENA_SW | 1, 			// 选择多声道模式，算法1，对应 LISTEN_MODE_SURROUND3
	KCM_LISTEN_EFFECT | KCM_LISTEN_ENA_SW | 0, 				// 选择多声道音效，算法0，对应 LISTEN_MODE_SURROUND4
};

static const char* TabTextInSrc[] = {						// 音源输入文字
	"无效代码","模拟","光纤","同轴1","同轴2","SD/TF卡","U盘","USB声卡","外置7.1","蓝牙","HDMI1","HDMI2","HDMI3","ARC",
};

static const char* Tab_Listen_Mode[] = {					// 聆听模式文字
	"无效代码","HIFI", "2+ICH", "源码无音效", "环绕声1", "无超低音环绕声", "环绕声2", "多声道混响"
};

static const char* Tab_DIP_EqMode[] = {						// EQ音效文字
	"无效代码","平直","流行","古典","摇滚",
};

static const char* Tab_DIP_ChannelShow[] = {				// 噪音测试和声调微调显示的字眼
	"前置左声道","前置右声道","中置","超低音","环绕左声道","环绕右声道","后置左声道","后置右声道"
};

uint8_t MKCM_ToRegister(uint8_t regAddr, uint8_t counter) {	// 从本机处理的值，转换到KCM寄存器的值
	switch (regAddr) {
	case KCM_INPUT_SOURCE:									// 输入端口选择
		return Tab_InputSwitch[counter];
	}
	return 0;
}
uint8_t MKCM_FromRegister(uint8_t regAddr, uint8_t value) {	// 从KCM来的寄存器，转换到本机处理的值
	uint8_t gLocal_1 = 0;
	switch (regAddr) {
	case KCM_INPUT_SOURCE:									// 音源输入选择
		do {
			if (Tab_InputSwitch[gLocal_1] == value) {
				//MLOGD("ShowInSource BBB (%02x)", gLocal_1);
				return gLocal_1;
			}
		} while (++gLocal_1 < sizeof(Tab_InputSwitch));
		return 0;											// 超出范围，返回默认值0dB
	case KCM_LISTEN_MODE:									// 聆听模式选择
		do {
			if (Tab_ListenMode[gLocal_1] == value) {
				return gLocal_1;
			}
		} while (++gLocal_1 < sizeof(Tab_ListenMode));
		return KCM_LISTEN_STEREO;							// 超出范围，返回默认值双声道立体声
	}
	return 0;												// 超出范围，返回默认值0dB
}


void writeInSource(uint8_t value) {
	mKc3x->InSource = value;
	if (DntRegWrite()) {
		isTabKc3xRegi = true;
	}else {
		CLOGE(TAG, "write InSource Error %02x", value);
	}
}
void writeListenMode(uint8_t value) {
	mKc3x->ListenMode = value;
	if (DntRegWrite()) {
		isTabKc3xRegi = true;
	}
	else {
		CLOGE(TAG, "write ListenMode Error %02x", value);
	}
}
void writeEqSelect(uint8_t value) {
	mKc3x->EqSelect = value;
	if (DntRegWrite()) {
		isTabKc3xRegi = true;
	}
	else {
		CLOGE(TAG, "write EqSelect Error %02x", value);
	}
}

void CTabAudioKc3x::ShowInSource(uint8_t value) {		// 音源输入
	uint8_t index = MKCM_FromRegister(KCM_INPUT_SOURCE, value);
	WCHAR bytes[64];
	//MLOGD("ShowInSource 音源输入 (%02x) (%d) (%s)", value, index, (char*)TabTextInSrc[index]);
	TxtGbkUnicode((char*)bytes, 64, (char*)TabTextInSrc[index]);
	CString text;
	text.Format(L"音源输入：%s", bytes);
	((CStatic*)GetDlgItem(IDC_STATIC_IN_SRC))->SetWindowText(text);
}

void CTabAudioKc3x::ShowListenMode(uint8_t value) {		// 聆听模式
	uint8_t index = MKCM_FromRegister(KCM_LISTEN_MODE, value);
	WCHAR bytes[64];
	//MLOGD("ShowListenMode 聆听模式 (%02x) (%d) (%s)", value, index, (char*)Tab_Listen_Mode[index]);
	TxtGbkUnicode((char*)bytes, 64, (char*)Tab_Listen_Mode[index]);
	CString text;
	text.Format(L"聆听模式：%s", bytes);
	((CStatic*)GetDlgItem(IDC_STATIC_LISTEN_MODE))->SetWindowText(text);
}

void CTabAudioKc3x::ShowEqMode(uint8_t value) {		// 音效输入
	WCHAR bytes[64];
	++value;										// +1为了显示正确的字眼Tab_DIP_EqMode
	if (value <0 || value >= 5) {					// 超出范围，返回默认值0
		value = 0;
	}
	//MLOGD("ShowInSource 音效输入BB (%d) (%s)",  value, (char*)Tab_DIP_EqMode[value]);
	TxtGbkUnicode((char*)bytes, 64, (char*)Tab_DIP_EqMode[value]);
	CString text;
	text.Format(L"音效输入：%s", bytes);
	((CStatic*)GetDlgItem(IDC_STATIC_EQ_MODE))->SetWindowText(text);
}

void CTabAudioKc3x::ShowAccount(bool init) {
	char an_0[32];
	DbsGetMemText(an_0, sizeof(an_0), "an_0");
	char ap_0[32];
	DbsGetMemText(ap_0, sizeof(ap_0), "ap_0");
	char an_1[32];
	DbsGetMemText(an_1, sizeof(an_1), "an_1");
	char gv_1[32];
	DbsGetMemText(gv_1, sizeof(gv_1), "gv_1");
	char bytes[100];
	TxtFormat(bytes, sizeof(bytes), "%s&%s&%s&%s", an_0, ap_0, an_1, gv_1);
	CString text(bytes);
	((CEdit*)GetDlgItem(IDC_EDIT_LOGIN))->SetWindowText(text);	
}

void CTabAudioKc3x::ShowRegister() {
	char bytes[8192];
	DNT_INFO* info = DntGetInfo();							// 获取DNT_INFO*
	int regSize = info->RegSize;

	int offset = TxtFormat(bytes, 512, "dn及gv使用自己的账号名及密码，当前默认使用动态域名申请的账号\r\n");

	//MLOGD("噪音测试AAAAAAAAA (%d)(%02x)(%02x)(%02x)(%02x)(%02x)(%02x)(%02x)(%02x)(%02x)", (mKc3x->TestTone & 0x0f), mKc3x->TestTone, mKc3x->Trim[SPK_CH_FL], mKc3x->Trim[SPK_CH_FR], mKc3x->Trim[SPK_CH_CE],
	//	mKc3x->Trim[SPK_CH_SW], mKc3x->Trim[SPK_CH_SL], mKc3x->Trim[SPK_CH_SR], mKc3x->Trim[SPK_CH_BL], mKc3x->Trim[SPK_CH_BR]);
	if (mKc3x->TestTone != 0) {
		offset += TxtFormat(bytes + offset, 512 - offset, "噪音测试：%s %ddB\r\n", (char*)Tab_DIP_ChannelShow[mKc3x->TestTone & 0x0f],  mKc3x->Trim[mKc3x->TestTone & 0x0f]);
	}
	int total = mKc3x->FileQty & 0x3fff;								// 获取设备里面的总数量
	if (total != 0) {
		if ((mKc3x->InSource == 0x30) || (mKc3x->InSource == 0x31)) {	// SD卡播放 或 U盘播放		
			if (mKc3x->PlayState & 0x04) {								//播放已停止 
				offset += TxtFormat(bytes + offset, 512 - offset, "%02d:%02d  %02d:%02d  (%d / %d)\r\n", 0 / 60, 0 % 60, mKc3x->FileTime / 60, mKc3x->FileTime % 60, (mKc3x->PlayGetIdx + 1), total);
			}
			else {														// 播放时间
				offset += TxtFormat(bytes + offset, 512 - offset, "%02d:%02d  %02d:%02d  (%d / %d)\r\n", mKc3x->PlayTime / 60, mKc3x->PlayTime % 60, mKc3x->FileTime / 60, mKc3x->FileTime % 60, (mKc3x->PlayGetIdx + 1), total);
			}
		}
	}

	offset += TxtFormat(bytes + offset, 512 - offset, "屏幕亮度：%d\r\n", (mKc3x->Brightness & 0x0f)+1);

	if (mKc3x->Flag & 0x01) {				// 待机  查看B0位是高位1还是低位0
		offset += TxtFormat(bytes + offset, 512 - offset, "待机：已打开\r\n");
	}
	if (mKc3x->Flag & 0x02) {				// 静音	查看B1位是高位1还是低位0
		offset += TxtFormat(bytes + offset, 512 - offset, "静音：已打开\r\n");
	}
	if (mKc3x->Flag & 0x04) {				// 夜间模式	 查看B2位是高位1还是低位0
		offset += TxtFormat(bytes + offset, 512 - offset, "夜间模式：已打开\r\n");
	}

	bytes[offset] = 0;
	CString string(bytes);
	((CStatic*)GetDlgItem(IDC_EDIT_TIPS))->SetWindowText(string);

	ShowSlider(-1);														// 音量显示文字
	ShowInSource(mKc3x->InSource);										// 音源输入显示文字
	ShowListenMode(mKc3x->ListenMode);									// 聆听模式显示文字
	ShowEqMode(mKc3x->EqSelect);										// 音效输入显示文字
}
#define OFFSETOF(_type, _member) ((size_t)(&((_type *)0)->_member))		// 获取结构体内部成员变量的位置偏移


void CTabAudioKc3x::ShowSlider(int position) {
	CString text;
	if (mKc3x->Flag & 0x02) {				// 静音
		//CLOGE(TAG, "音量调节BBBB 静音 SetPos(0)");
		text.Format(L"主音量:%d / %d", 0, mKc3x->MaxMasterVol);
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_VOLUME))->SetPos(0);
		((CStatic*)GetDlgItem(IDC_SLIDER_VOLUME))->EnableWindow(false);		// 不能滑动滑块
	}
	else {
		if (position >= 0) {
			mKc3x->Volume = position;
		}
		if (mKc3x->MaxMasterVol > 0) {
			((CSliderCtrl*)GetDlgItem(IDC_SLIDER_VOLUME))->SetRange(0, mKc3x->MaxMasterVol);
		}
		//CLOGE(TAG, "音量调节CCCC 正常 SetPos(%d)", mKc3x->Volume);
		text.Format(L"主音量:%d / %d", mKc3x->Volume, mKc3x->MaxMasterVol);
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_VOLUME))->SetPos(mKc3x->Volume);
		((CStatic*)GetDlgItem(IDC_SLIDER_VOLUME))->EnableWindow(true);		// 能滑动滑块
	}
	((CStatic*)GetDlgItem(IDC_STATIC_VOLUME))->SetWindowText(text);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// C++语言对话框函数 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// CTabAudioKc3x 对话框

IMPLEMENT_DYNAMIC(CTabAudioKc3x, CDialogEx)

CTabAudioKc3x::CTabAudioKc3x(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_TAB_AUDIO_KC3X, pParent){
	gPlayOperate = 0;
}

CTabAudioKc3x::~CTabAudioKc3x(){
}

void CTabAudioKc3x::DoDataExchange(CDataExchange* pDX){
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CTabAudioKc3x, CDialogEx)
	ON_WM_TIMER()
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_VOLUME, &CTabAudioKc3x::OnNMCustomdrawSliderVolume)
	ON_BN_CLICKED(IDC_BUTTON_LOGIN, &CTabAudioKc3x::OnBnClickedButtonLogin)
	ON_BN_CLICKED(IDC_BTN_OPTICA, &CTabAudioKc3x::OnBnClickedBtnOptica)
	ON_BN_CLICKED(IDC_BTN_HDMI1, &CTabAudioKc3x::OnBnClickedBtnHdmi1)
	ON_BN_CLICKED(IDC_BTN_HDMI2, &CTabAudioKc3x::OnBnClickedBtnHdmi2)
	ON_BN_CLICKED(IDC_BTN_HDMI3, &CTabAudioKc3x::OnBnClickedBtnHdmi3)
	ON_BN_CLICKED(IDC_BTN_HDIMARC, &CTabAudioKc3x::OnBnClickedBtnHdimarc)
	ON_BN_CLICKED(IDC_BTN_COA1, &CTabAudioKc3x::OnBnClickedBtnCoa1)
	ON_BN_CLICKED(IDC_BTN_COA2, &CTabAudioKc3x::OnBnClickedBtnCoa2)
	ON_BN_CLICKED(IDC_BTN_AUX, &CTabAudioKc3x::OnBnClickedBtnAux)
	ON_BN_CLICKED(IDC_BTN_FLAT, &CTabAudioKc3x::OnBnClickedBtnFlat)
	ON_BN_CLICKED(IDC_BTN_POPULAR, &CTabAudioKc3x::OnBnClickedBtnPopular)
	ON_BN_CLICKED(IDC_BTN_CLASS, &CTabAudioKc3x::OnBnClickedBtnClass)
	ON_BN_CLICKED(IDC_BTN_ROCK, &CTabAudioKc3x::OnBnClickedBtnRock)
	ON_BN_CLICKED(IDC_BTN_JAZZ, &CTabAudioKc3x::OnBnClickedBtnJazz)
	ON_BN_CLICKED(IDC_BTN_VOCAL, &CTabAudioKc3x::OnBnClickedBtnVocal)
	ON_BN_CLICKED(IDC_BTN_HIFI, &CTabAudioKc3x::OnBnClickedBtnHifi)
	ON_BN_CLICKED(IDC_BTN_2ICH, &CTabAudioKc3x::OnBnClickedBtn2ich)
	ON_BN_CLICKED(IDC_BTN_SURROUND1, &CTabAudioKc3x::OnBnClickedBtnSurround1)
	ON_BN_CLICKED(IDC_BTN_SURROUND2, &CTabAudioKc3x::OnBnClickedBtnSurround2)
	ON_BN_CLICKED(IDC_BTN_SURROUND3, &CTabAudioKc3x::OnBnClickedBtnSurround3)
	ON_BN_CLICKED(IDC_BTN_SURROUND4, &CTabAudioKc3x::OnBnClickedBtnSurround4)
	ON_BN_CLICKED(IDC_BTN_SURROUND5, &CTabAudioKc3x::OnBnClickedBtnSurround5)
	ON_BN_CLICKED(IDC_BTN_VIDEO, &CTabAudioKc3x::OnBnClickedBtnVideo)
	ON_BN_CLICKED(IDC_BTN_BRIGHTNESS, &CTabAudioKc3x::OnBnClickedBtnBrightness)
	ON_BN_CLICKED(IDC_BTN_MIC, &CTabAudioKc3x::OnBnClickedBtnMic)
	ON_BN_CLICKED(IDC_BTN_TEST_TONE, &CTabAudioKc3x::OnBnClickedBtnTestTone)
	ON_BN_CLICKED(IDC_BTN_SPEAKER, &CTabAudioKc3x::OnBnClickedBtnSpeaker)
	ON_BN_CLICKED(IDC_BTN_MUTE_OPEN, &CTabAudioKc3x::OnBnClickedBtnMuteOpen)
	ON_BN_CLICKED(IDC_BTN_MUTE_CLOSE, &CTabAudioKc3x::OnBnClickedBtnMuteClose)
	ON_BN_CLICKED(IDC_BTN_STANDBY_OPEN, &CTabAudioKc3x::OnBnClickedBtnStandbyOpen)
	ON_BN_CLICKED(IDC_BTN_NIGTT_MODE_OPEN, &CTabAudioKc3x::OnBnClickedBtnNigttModeOpen)
	ON_BN_CLICKED(IDC_BTN_NIGTT_MODE_CLOSE, &CTabAudioKc3x::OnBnClickedBtnNigttModeClose)

	ON_BN_CLICKED(IDC_BTN_MUSIC_SD, &CTabAudioKc3x::OnBnClickedBtnMusicSd)
	ON_BN_CLICKED(IDC_BTN_MUSIC_Udisk, &CTabAudioKc3x::OnBnClickedBtnMusicUdisk)
	ON_BN_CLICKED(IDC_DELAY_ADJ, &CTabAudioKc3x::OnBnClickedDelayAdj)
	ON_BN_CLICKED(IDC_SOUND_EFFECT, &CTabAudioKc3x::OnBnClickedSoundEffect)
END_MESSAGE_MAP()


// CTabAudioKc3x 消息处理程序

extern CTabAudioKc3x* mTabAudioKc3x;
static void changRegCallback() {
	if (mTabAudioKc3x != NULL) {
		mTabAudioKc3x->ShowRegister();
	}
}

extern "C" static void loginOkCallback() {
	//DntRegPowerOn(false);										// 读完整的寄存器，一般是在初始化时调用一次
}

BOOL CTabAudioKc3x::OnInitDialog(){
	CDialogEx::OnInitDialog();

	// TODO:  在此添加额外的初始化

	mKc3x = (KC3X_REGI_DIFF*)mTEST.MyReg;
	mTabAudioKc3x = this;
	isTabKc3xRegi = false;
	ShowAccount(true);
	ShowRegister();

	TestChangRegCallback(changRegCallback);
	TestLoginOkCallback(loginOkCallback);
	autoLogin = true;
	SetTimer(1, 1000, NULL);
	return TRUE;
	// 异常: OCX 属性页应返回 FALSE
}

void CTabAudioKc3x::OnTimer(UINT_PTR nIDEvent) {
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (autoLogin) {
		autoLogin = false;
		//OnBnClickedButtonLogin();
	}
	
	if (isTabKc3xRegi) {
		isTabKc3xRegi = false;
		ShowRegister();
	}
	CDialogEx::OnTimer(nIDEvent);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////

void CTabAudioKc3x::OnNMCustomdrawSliderVolume(NMHDR* pNMHDR, LRESULT* pResult) {		// 音量调节
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	int position = ((CSliderCtrl*)GetDlgItem(IDC_SLIDER_VOLUME))->GetPos();
	DNT_INFO* info = &mTEST.Info;
	if (info->LoginOk) {
		CLOGE(TAG, "音量调节AAAA 读取滑块数值（%d）", position);
		ShowSlider(position);
		DntRegWrite();					// 写寄存器
		isTabKc3xRegi = true;
	}
	*pResult = 0;
}
void CTabAudioKc3x::OnBnClickedButtonLogin(){
	CPopAccount dlg;
	dlg.DoModal();
	TestChangRegCallback(changRegCallback);
	TestLoginOkCallback(loginOkCallback);



	/*
	char bytes[128];
	CString string;
	((CEdit*)GetDlgItem(IDC_EDIT_LOGIN))->GetWindowText(string);
	TxtUnicodeUtf8(bytes, sizeof(bytes), (short*)string.AllocSysString());	// UNICODE转换到GUTF8
	char* array[8];
	int length = (int)strlen(bytes);
	int qty = TxtKeyArray((size_t*)array, bytes, length, '&', 1);
	if (qty == 4) {
		static const char* tabLogin[] = { "an_0", "ap_0", "an_1", "gv_1" };
		for (int index = 0; index < 4; index++) {
			if ((int)strlen(array[index]) < 1) {
				::AfxMessageBox(L"登录出错，账号信息不能为空");
				return;
			}
		}
		for (int index = 0; index < 4; index++) {
			DbsSetMemText((char*)tabLogin[index], array[index]);
		}
		//DntSetState(STATE_LOGIN);			// 改变运行状态为登录服务器	
		DntSetIdleFlag(DNT_RB_LOGIN);		// 空闲回调 登录
		return;
	}
	::AfxMessageBox(L"出错");
	*/

}


void CTabAudioKc3x::OnBnClickedBtnOptica() {	// 光纤
	writeInSource(KCM_INPUT_RX1);
}

void CTabAudioKc3x::OnBnClickedBtnCoa1() {		// 同轴1
	writeInSource(KCM_INPUT_RX2);
}

void CTabAudioKc3x::OnBnClickedBtnCoa2() {		// 同轴2
	writeInSource(KCM_INPUT_RX3);
}

void CTabAudioKc3x::OnBnClickedBtnAux() {		// 模拟
	writeInSource(KCM_INPUT_ANALOG);
}

void CTabAudioKc3x::OnBnClickedBtnVideo() {		// 视频
	// TODO: 在此添加控件通知处理程序代码
}

void CTabAudioKc3x::OnBnClickedBtnMusicSd(){	// SD/TF卡
	if ((mKc3x->SrcValid & 0x20)) {				// SD插入 
		CLOGI(TAG, "播放AAA C (%02x)(%02x)(%d)", (mKc3x->PlayState & 0x02), (mKc3x->PlayState & 0x04), gPlayOperate);
		if ((mKc3x->PlayState & 0x02) || (mKc3x->PlayState & 0x04)) {	// 暂停或停止
			++gPlayOperate;
			CLOGI(TAG, "播放AAA D (%d)", gPlayOperate);
			mKc3x->PlayOperate = 0x01 | gPlayOperate << 6;		// 将B0变为高位1 (播放)
		}
		writeInSource(KCM_INPUT_SD);
	}
}

void CTabAudioKc3x::OnBnClickedBtnMusicUdisk(){	// U盘
	if ((mKc3x->SrcValid & 0x40)) {				// U盘插入
		if ((mKc3x->PlayState & 0x02) || (mKc3x->PlayState & 0x04)) {	// 暂停或停止
			++gPlayOperate;
			mKc3x->PlayOperate = 0x01 | gPlayOperate << 6;		// 将B0变为高位1 (播放)
		}
		writeInSource(KCM_INPUT_UDISK);
	}
}

void CTabAudioKc3x::OnBnClickedBtnHdmi1(){		// HDMI1
	writeInSource(KCM_INPUT_HDMI1);
}

void CTabAudioKc3x::OnBnClickedBtnHdmi2(){		// HDMI2
	writeInSource(KCM_INPUT_HDMI2);
}

void CTabAudioKc3x::OnBnClickedBtnHdmi3(){		// HDMI3
	writeInSource(KCM_INPUT_HDMI3);
}

void CTabAudioKc3x::OnBnClickedBtnHdimarc(){	// HDMI-ARC
	writeInSource(KCM_INPUT_ARC);
}

void CTabAudioKc3x::OnBnClickedBtnFlat(){		// 平直
	writeEqSelect(0x00);
}

void CTabAudioKc3x::OnBnClickedBtnPopular(){	// 流行
	writeEqSelect(0x01);
}

void CTabAudioKc3x::OnBnClickedBtnClass(){		// 古典
	writeEqSelect(0x02);
}

void CTabAudioKc3x::OnBnClickedBtnRock(){		// 摇滚
	writeEqSelect(0x03);
}

void CTabAudioKc3x::OnBnClickedSoundEffect() {	// 音效EQ调节
	CPopEq dlg;
	dlg.DoModal();
	TestChangRegCallback(changRegCallback);
	TestLoginOkCallback(loginOkCallback);
}

void CTabAudioKc3x::OnBnClickedBtnJazz(){		// 爵士
	writeEqSelect(0x04);
}

void CTabAudioKc3x::OnBnClickedBtnVocal(){		// 人声
	writeEqSelect(0x05);
}

void CTabAudioKc3x::OnBnClickedBtnHifi(){		// HIFI
	writeListenMode(0x00);
}

void CTabAudioKc3x::OnBnClickedBtn2ich(){		// 2+ICH
	writeListenMode(0x80);
}

void CTabAudioKc3x::OnBnClickedBtnSurround1(){	// 原码无音效
	writeListenMode(0x90);
}

void CTabAudioKc3x::OnBnClickedBtnSurround2(){	// 环绕声1
	writeListenMode(0xa0);
}

void CTabAudioKc3x::OnBnClickedBtnSurround3(){	// 无超低音环绕声
	writeListenMode(0x21);
}

void CTabAudioKc3x::OnBnClickedBtnSurround4(){	// 环绕声2
	writeListenMode(0xa1);
}

void CTabAudioKc3x::OnBnClickedBtnSurround5(){	// 多声道混响
	writeListenMode(0xb0);
}



void CTabAudioKc3x::OnBnClickedBtnBrightness() {// 亮度	B7:4最大值 B3:0当前值
	int brightness = mKc3x->Brightness & 0x0f;	// 查看B3-B0位
	int Maxbri = mKc3x->Brightness >> 4;		// 查看B7-B4位
	CLOGE(TAG, "亮度A (%02x)(%02x)(%02x)", mKc3x->Brightness, brightness, Maxbri);
	if (brightness >= (Maxbri - 1)) {					// 超出最大值
		brightness = 0;
	}
	else {
		++brightness;		
	}
	mKc3x->Brightness = (Maxbri << 4) | brightness;	
	CLOGE(TAG, "亮度B (%02x)(%02x)", mKc3x->Brightness, brightness);
	DntRegWrite();								// 写寄存器
	isTabKc3xRegi = true;
}

void CTabAudioKc3x::OnBnClickedBtnMic(){		// 麦克风调节
	CPopMic dlg;
	dlg.DoModal();
	TestChangRegCallback(changRegCallback);
	TestLoginOkCallback(loginOkCallback);
}

void CTabAudioKc3x::OnBnClickedBtnTestTone(){	// 噪音测试
	CPopTestTone dlg;
	dlg.DoModal();
	TestChangRegCallback(changRegCallback);
	TestLoginOkCallback(loginOkCallback);
}

void CTabAudioKc3x::OnBnClickedBtnSpeaker(){	// 喇叭设置
	CPopSpeaker dlg;
	dlg.DoModal();
	TestChangRegCallback(changRegCallback);
	TestLoginOkCallback(loginOkCallback);
}

void CTabAudioKc3x::OnBnClickedDelayAdj() {		// 延时调节
	CPopDelay dlg;
	dlg.DoModal();
	TestChangRegCallback(changRegCallback);
	TestLoginOkCallback(loginOkCallback);
}

void CTabAudioKc3x::OnBnClickedBtnStandbyOpen() {	// 打开待机	// 标志 B0=STANDBY B1=MUTE B2=杜比数码动态压缩 B4-B6为对应的控制位
	mKc3x->Flag |= 0x01;							// 将B0变为高位1
	mKc3x->Flag |= 0x10;							// B4-B6为对应的控制位
	CLOGE(TAG, "打开待机A (%02x)", mKc3x->Flag);
	DntRegWrite();									// 写寄存器
	isTabKc3xRegi = true;
}

/*
void CTabAudioKc3x::OnBnClickedBtnStandbyClose() {	// 关闭待机 // 标志 B0=STANDBY B1=MUTE B2=杜比数码动态压缩 B4-B6为对应的控制位
	mKc3x->Flag &= ~0x01;							// 将B0变为低位0
	mKc3x->Flag |= 0x10;							// B4-B6为对应的控制位
	CLOGE(TAG, "关闭待机A (%02x)", mKc3x->Flag);
	DntRegWrite();									// 写寄存器
	isTabKc3xRegi = true;
}
*/
void CTabAudioKc3x::OnBnClickedBtnMuteOpen(){		// 打开静音  // 标志 B0=STANDBY B1=MUTE B2=杜比数码动态压缩 B4-B6为对应的控制位
	mKc3x->Flag |= 0x02;							// 将B1变为高位1
	mKc3x->Flag |= 0x20;							// B4-B6为对应的控制位
	DntRegWrite();									// 写寄存器
	isTabKc3xRegi = true;
	CLOGE(TAG, "打开静音B (%02x)", mKc3x->Flag);
}

void CTabAudioKc3x::OnBnClickedBtnMuteClose(){		// 关闭静音  // 标志 B0=STANDBY B1=MUTE B2=杜比数码动态压缩 B4-B6为对应的控制位
	CLOGE(TAG, "关闭静音A (%02x)", mKc3x->Flag);
	mKc3x->Flag &= ~0x02;							// 将B1变为低位0
	mKc3x->Flag |= 0x20;							// B4-B6为对应的控制位
	DntRegWrite();									// 写寄存器
	isTabKc3xRegi = true;
	CLOGE(TAG, "关闭静音B (%02x)", mKc3x->Flag);
}

void CTabAudioKc3x::OnBnClickedBtnNigttModeOpen(){	// 打开夜间模式	// 标志 B0=STANDBY B1=MUTE B2=杜比数码动态压缩 B4-B6为对应的控制位
	CLOGE(TAG, "打开夜间模式 A (%02x)", mKc3x->Flag);
	mKc3x->Flag |= 0x04;							// 将B2变为高位1
	mKc3x->Flag |= 0x40;							// B4-B6为对应的控制位
	CLOGE(TAG, "打开夜间模式 B (%02x)", mKc3x->Flag);
	DntRegWrite();									// 写寄存器
	isTabKc3xRegi = true;
}

void CTabAudioKc3x::OnBnClickedBtnNigttModeClose(){	// 关闭夜间模式	// 标志 B0=STANDBY B1=MUTE B2=杜比数码动态压缩 B4-B6为对应的控制位
	CLOGE(TAG, "关闭夜间模式 C (%02x)", mKc3x->Flag);
	mKc3x->Flag &= ~0x04;							// 将B2变为低位0
	mKc3x->Flag |= 0x40;							// B4-B6为对应的控制位
	CLOGE(TAG, "关闭夜间模式 D (%02x)", mKc3x->Flag);
	DntRegWrite();									// 写寄存器
	isTabKc3xRegi = true;
}
